home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / fun / pz.1 < prev    next >
Text File  |  1989-03-09  |  21KB  |  593 lines

  1. Path: xanth!lll-winken!ames!ll-xn!adelie!infinet!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i039:  pz - slide-the-tiles-around puzzle
  5. Message-ID: <12084@swan.ulowell.edu>
  6. Date: 8 Mar 89 20:23:27 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 582
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: migh@cuuxb.ATT.COM (Mike Hall)
  12. Posting-number: Volume 89, Issue 39
  13. Archive-name: fun/pz.1
  14.  
  15. [I put the small executable and the 15 tile images in a zoo, uuencoded
  16. it and kept it with this posting.  ..Bob]
  17.  
  18. #    This is a shell archive.
  19. #    Remove everything above and including the cut line.
  20. #    Then run the rest of the file through sh.
  21. #----cut here-----cut here-----cut here-----cut here----#
  22. #!/bin/sh
  23. # shar:    Shell Archiver
  24. #    Run the following text with /bin/sh to create:
  25. #    ReadMe.Pz15
  26. #    Compile.it
  27. #    imgs.c
  28. #    pz.c
  29. #    bin.zuu
  30. # This archive created: Wed Mar  8 15:20:11 1989
  31. cat << \SHAR_EOF > ReadMe.Pz15
  32.  
  33. Pz15 - the "15" puzzle
  34.  
  35.     Do you remember those cheap plastic puzzles with 15 white tiles 
  36.     numbered 1 through 15 and an empty square in a 4 by 4 arrangement?
  37.     You know, at the check out racks in K-Mart or the local grocery?
  38.     The ones that you'd pry up a tile in the center, and then rearrange
  39.     them all to make it look like you solved it?  Just to get your
  40.     sister mad?  Well, here it is again!
  41.  
  42.     To move the tiles around, just click on the tile that you want to
  43.     move (pretend the mouse pointer is your finger - except you don't
  44.     have to actually slide anything around).  You can even click at
  45.     the end of a row or column of tiles and move all three over to 
  46.     fill in the empty square.
  47.  
  48.     To quit the game, use the close gadget, or send it a ^C (from the
  49.     parent CLI window, or with the 'break' command).
  50.  
  51.     It's not a smart puzzle - it doesn't detect when you're done
  52.     (besides, there's different ways of solving it).
  53.  
  54.     For those adventurous folks, some enhancements might include
  55.     a gadget to reshuffle the tiles, or animate the tiles sliding
  56.     around, or allow the puzzle to be resized.
  57.  
  58.     The source for it is in "pz.c", and the tile images are in "imgs.c".
  59.     The source is pretty grody looking in places - lots of "unsigned
  60.     shorts".  I'd love to hear of more tricks to get it even smaller yet.
  61.     It was just 4088 bytes with Lattice 4.0, now with 5.0 its 2808 bytes!
  62.  
  63.     Have fun!
  64.  
  65. Mike Hall    2 S 461 Cherice Dr.    Warrenville, IL     60555
  66. 312-393-6350    att!cuuxb!migh
  67.  
  68. SHAR_EOF
  69. cat << \SHAR_EOF > Compile.it
  70. lc -ad -M imgs
  71. lc -w -v -Lcdn -M pz imgs
  72. rename pz Pz15
  73.  
  74. SHAR_EOF
  75. cat << \SHAR_EOF > imgs.c
  76. /*
  77.  *    image data for the puzzle tiles (empty, numbers 1 thru 15) 
  78.  */
  79.  
  80. unsigned short id0[]={
  81. /*-------------- plane 0 ---------------*/
  82. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
  83. 0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
  84. 0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
  85. 0xffff,0xfffe,
  86. };
  87.  
  88. unsigned short id1[]={
  89. /*-------------- plane 0 ---------------*/
  90. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc001,0xc006,
  91. 0xc003,0xc006,0xc007,0xc006,0xc001,0xc006,0xc001,0xc006,
  92. 0xc001,0xc006,0xc007,0xf006,0xc000,0x0006,0xc000,0x0006,
  93. 0xffff,0xfffe,
  94. };
  95.  
  96. unsigned short id2[]={
  97. /*-------------- plane 0 ---------------*/
  98. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
  99. 0xc00e,0x7006,0xc000,0x7006,0xc001,0xc006,0xc007,0x8006,
  100. 0xc00e,0x0006,0xc00f,0xf006,0xc000,0x0006,0xc000,0x0006,
  101. 0xffff,0xfffe,
  102. };
  103.  
  104. unsigned short id3[]={
  105. /*-------------- plane 0 ---------------*/
  106. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
  107. 0xc00e,0x7006,0xc000,0x7006,0xc001,0xe006,0xc000,0x7006,
  108. 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
  109. 0xffff,0xfffe,
  110. };
  111.  
  112. unsigned short id4[]={
  113. /*-------------- plane 0 ---------------*/
  114. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc003,0xe006,
  115. 0xc007,0xe006,0xc00e,0xe006,0xc01c,0xe006,0xc01f,0xf806,
  116. 0xc000,0xe006,0xc000,0xe006,0xc000,0x0006,0xc000,0x0006,
  117. 0xffff,0xfffe,
  118. };
  119.  
  120. unsigned short id5[]={
  121. /*-------------- plane 0 ---------------*/
  122. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xf006,
  123. 0xc00e,0x0006,0xc00f,0xe006,0xc000,0x7006,0xc000,0x3006,
  124. 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
  125. 0xffff,0xfffe,
  126. };
  127.  
  128. unsigned short id6[]={
  129. /*-------------- plane 0 ---------------*/
  130. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xc006,
  131. 0xc00e,0x0006,0xc01c,0x0006,0xc01f,0xc006,0xc01c,0xe006,
  132. 0xc01c,0xe006,0xc00f,0xc006,0xc000,0x0006,0xc000,0x0006,
  133. 0xffff,0xfffe,
  134. };
  135.  
  136. unsigned short id7[]={
  137. /*-------------- plane 0 ---------------*/
  138. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc01f,0xe006,
  139. 0xc018,0xe006,0xc000,0xe006,0xc001,0xc006,0xc003,0x8006,
  140. 0xc003,0x8006,0xc003,0x8006,0xc000,0x0006,0xc000,0x0006,
  141. 0xffff,0xfffe,
  142. };
  143.  
  144. unsigned short id8[]={
  145. /*-------------- plane 0 ---------------*/
  146. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
  147. 0xc00e,0x7006,0xc00e,0x7006,0xc007,0xe006,0xc00e,0x7006,
  148. 0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
  149. 0xffff,0xfffe,
  150. };
  151.  
  152. unsigned short id9[]={
  153. /*-------------- plane 0 ---------------*/
  154. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xc006,
  155. 0xc01c,0xe006,0xc01c,0xe006,0xc00f,0xe006,0xc000,0xe006,
  156. 0xc001,0xc006,0xc007,0x8006,0xc000,0x0006,0xc000,0x0006,
  157. 0xffff,0xfffe,
  158. };
  159.  
  160. unsigned short id10[]={
  161. /*-------------- plane 0 ---------------*/
  162. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
  163. 0xc0f0,0xe706,0xc1f0,0xe706,0xc070,0xe706,0xc070,0xe706,
  164. 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
  165. 0xffff,0xfffe,
  166. };
  167.  
  168. unsigned short id11[]={
  169. /*-------------- plane 0 ---------------*/
  170. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc038,0x1c06,
  171. 0xc078,0x3c06,0xc0f8,0x7c06,0xc038,0x1c06,0xc038,0x1c06,
  172. 0xc038,0x1c06,0xc0fe,0x7f06,0xc000,0x0006,0xc000,0x0006,
  173. 0xffff,0xfffe,
  174. };
  175.  
  176. unsigned short id12[]={
  177. /*-------------- plane 0 ---------------*/
  178. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
  179. 0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1c06,0xc070,0x7806,
  180. 0xc070,0xe006,0xc1fc,0xff06,0xc000,0x0006,0xc000,0x0006,
  181. 0xffff,0xfffe,
  182. };
  183.  
  184. unsigned short id13[]={
  185. /*-------------- plane 0 ---------------*/
  186. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
  187. 0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1e06,0xc070,0x0706,
  188. 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
  189. 0xffff,0xfffe,
  190. };
  191.  
  192. unsigned short id14[]={
  193. /*-------------- plane 0 ---------------*/
  194. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x3e06,
  195. 0xc0f0,0x7e06,0xc1f0,0xee06,0xc071,0xce06,0xc071,0xff86,
  196. 0xc070,0x0e06,0xc1fc,0x0e06,0xc000,0x0006,0xc000,0x0006,
  197. 0xffff,0xfffe,
  198. };
  199.  
  200. unsigned short id15[]={
  201. /*-------------- plane 0 ---------------*/
  202. 0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0xff06,
  203. 0xc0f0,0xe006,0xc1f0,0xfe06,0xc070,0x0706,0xc070,0x0306,
  204. 0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
  205. 0xffff,0xfffe,
  206. };
  207.  
  208. SHAR_EOF
  209. cat << \SHAR_EOF > pz.c
  210. /*
  211.  *    15 puzzle 
  212.  */
  213.  
  214. #include    <intuition/intuition.h>
  215. #include    <libraries/dos.h>        /* just for SIGBREAKF_CTRL_C */
  216. #include    <proto/intuition.h>
  217. #include    <proto/exec.h>
  218.  
  219. extern struct IntuitionBase    *IntuitionBase;
  220. extern struct GfxBase        *GfxBase;
  221.  
  222. #define    NPZ    4        /* the square puzzle is NPZ x NPZ */
  223. #define    PZ_MT    0        /* the value of the "empty" tile */
  224.  
  225. char    pz[NPZ][NPZ];        /* the puzzle array */
  226. int    mtr, mtc;        /* location of the "empty" tile */
  227.  
  228. #define    R0    11        /* origin row/col of upper left */
  229. #define    C0    4
  230. #define    RS    (IMG_HT+1)    /* row/col scaling factors (match images!!) */
  231. #define    CS    (IMG_WID+3)
  232. #define    IMG_WID    0x1f        /* from the output of 'brush' */
  233. #define    IMG_HT    0xd
  234.  
  235. struct Image img = {        /* shared Image struct for all "tiles" */
  236.     0,0, IMG_WID,IMG_HT, 1, NULL, 1,0, NULL
  237. };
  238.  
  239. /* the image data (in chip ram!) */
  240. extern short    id0[], id1[],  id2[],  id3[],  id4[],  id5[],  id6[],  id7[], 
  241.         id8[], id9[], id10[], id11[], id12[], id13[], id14[], id15[];
  242.  
  243. short    *imgs[] = {        /* array of pointers to the image data arrays */
  244.     id0, id1,  id2,  id3,  id4,  id5,  id6,  id7,
  245.     id8, id9, id10, id11, id12, id13, id14, id15
  246. };
  247.  
  248. #define    W_WID    141
  249. #define    W_HT    68
  250. struct NewWindow newin = {
  251.     100,50, W_WID,W_HT, 2,-1,
  252.     MOUSEBUTTONS | CLOSEWINDOW | REFRESHWINDOW,
  253.     WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG | SIMPLE_REFRESH,
  254.     NULL, NULL, "Pz15", NULL, NULL, 0,0, 0,0, WBENCHSCREEN
  255. };
  256.  
  257. struct Window    *win = NULL;
  258. struct RastPort    *rp  = NULL;
  259.  
  260. /* Lattice likes prototypes: */
  261. void    putpiece(unsigned short, unsigned short, unsigned short);
  262. void    refrow(unsigned short), refcol(unsigned short);
  263. short    pzmove(unsigned short, unsigned short);
  264. void    byewin(long);
  265.  
  266. /*
  267.  *    Repaint a single tile.
  268.  */
  269. void putpiece(r, c, v)
  270. register unsigned short r, c, v;
  271. {
  272.     img.ImageData = imgs[v];
  273.     DrawImage(rp, &img, (long) c*CS+C0, (long) r*RS+R0);
  274. }
  275.  
  276. /*
  277.  *    Repaint a specified row.
  278.  */
  279. void refrow(r)
  280. register unsigned short r;
  281. {
  282.     register unsigned short c;
  283.  
  284.     for ( c = 0; c < NPZ; c++ )
  285.         putpiece(r, c, (unsigned short)pz[r][c]);
  286. }
  287.  
  288. /*
  289.  *    Repaint a specified column.
  290.  */
  291. void refcol(c)
  292. register unsigned short c;
  293. {
  294.     register unsigned short r;
  295.  
  296.     for ( r = 0; r < NPZ; r++ )
  297.         putpiece(r, c, (unsigned short) pz[r][c]);
  298. }
  299.  
  300. /*
  301.  *    Move the "empty" tile (MT) to the "moused" row and column.
  302.  */
  303. short pzmove(mr, mc)
  304. unsigned short mr, mc;
  305. {
  306.     register unsigned short     r,  c;        /* row/col counters */
  307.     register short    ir, ic;            /* row/col increments */
  308.  
  309.     if ( mtr == mr )        /* Are we in the same row as MT? */
  310.         ir = 0;                /* yes, row-inc is zero */
  311.     else
  312.         ir = (mtr < mr) ? 1 : -1;    /* yes, row-inc is +/-1 */
  313.  
  314.     if ( mtc == mc )        /* Are we in the same col as MT? */
  315.         ic = 0;                /* yes, col-inc is zero */
  316.     else
  317.         ic = (mtc < mc) ? 1 : -1;    /* yes, col-inc is +/-1 */
  318.  
  319.     if ( ir == 0 && ic == 0 )    /* If in same row and col as MT... */
  320.         return 0;        /* ... nothing to do */
  321.     if ( ir != 0 && ic != 0 )    /* If not in either row or col as MT... */
  322.         return -1;        /* ... too much to do */
  323.  
  324.     /* "double-loop", but really only r _or_ c gets changed */
  325.     for ( r = mtr, c = mtc; ; r += ir, c += ic ) {    /* start at MT */
  326.         pz[r][c] = pz[r+ir][c+ic];    /* shift pieces towards MT */
  327.         if ( r == mr && c == mc )    /* until we hit the 'moused' position */
  328.             break;
  329.     }
  330.     pz[mr][mc] = PZ_MT;        /* mark the new empty square */
  331.     mtr = mr;
  332.     mtc = mc;
  333.     if ( ir == 0 )            /* update the display */
  334.         refrow(mr);        /* either change a row */
  335.     else
  336.         refcol(mc);        /* or a column */
  337.     return 1;            /* say there was just enough to do */
  338. }
  339.  
  340. /*
  341.  *    Refresh the entire puzzle.
  342.  */
  343. void pzref()
  344. {
  345.     register unsigned short    r;
  346.  
  347.     for ( r = 0; r < NPZ; r++ )    
  348.         refrow(r);
  349. }
  350.  
  351. /*
  352.  *    Setup the puzzle array.
  353.  */
  354. void pzinit()
  355. {
  356.     register unsigned short    r, c, i;
  357.  
  358.     i = 0;
  359.     for ( r = 0; r < NPZ; r++ )
  360.         for ( c = 0; c < NPZ; c++ )
  361.             pz[c][r] = i++;        /* scramble a little */
  362. }
  363.  
  364. /*
  365.  *    Get mouse clicks and handle them.
  366.  */
  367. void dopuz()
  368. {
  369.     register struct IntuiMessage *msg;
  370.     register unsigned short    r, c;
  371.     unsigned long    class;
  372.     unsigned short    code;
  373.     long    flags, ret;
  374.  
  375.     flags = (1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C;
  376.  
  377.     /* loop, get mouse clicks, call pzmove() with reduced coords */
  378.     for ( ; ; ) {
  379.         ret = Wait ( flags );
  380.         while ( msg = (struct IntuiMessage *)GetMsg(win->UserPort) ) {
  381.             class = msg->Class;
  382.             code = msg->Code;
  383.             r = (msg->MouseY - R0) / RS;
  384.             c = (msg->MouseX - C0) / CS;
  385.             ReplyMsg((struct Message *)msg);
  386.             if ( class == MOUSEBUTTONS && code == SELECTDOWN ) {
  387.                 (void)pzmove(r, c);
  388.             }
  389.             else if ( class == REFRESHWINDOW ) {
  390.                 pzref();
  391.             }
  392.             else if ( class == CLOSEWINDOW ) {
  393.                 return;
  394.             }
  395.         }
  396.         if ( ret & SIGBREAKF_CTRL_C ) {
  397.             return;
  398.         }
  399.     }
  400. }
  401.  
  402. /*
  403.  *    Shut the window; put back the things we borrowed.
  404.  */
  405. void byewin(r)
  406. long r;
  407. {
  408.     if ( win )
  409.          CloseWindow(win);
  410.     if ( GfxBase )
  411.         CloseLibrary(GfxBase);
  412.     if ( IntuitionBase )
  413.         CloseLibrary(IntuitionBase);
  414.     _exit(r);
  415. }
  416.  
  417. /*
  418.  *    Open some libraries and a window.
  419.  */
  420. void mkwin()
  421. {
  422.     if ( (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)) == NULL )
  423.         byewin(-100L);
  424.     if ( (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) == NULL )
  425.         byewin(-101L);
  426.     if ( (win = (struct Window *)OpenWindow(&newin)) == NULL )
  427.         byewin(-102L);
  428.     rp = win->RPort;
  429. }
  430.  
  431. /*
  432.  *    FINALLY, here's where it all starts.
  433.  */
  434. void _main()
  435. {
  436.     mkwin();        /* open up our window */
  437.     pzinit();        /* initialize the puzzle */
  438.     pzref();        /* and show it */
  439.     dopuz();        /* play it, until we close or get a ^C */
  440.     byewin(0L);        /* then close the window and exit */
  441. }
  442.  
  443. SHAR_EOF
  444. cat << \SHAR_EOF > bin.zuu
  445.  
  446. begin 644 bin.zoo
  447. M6D]/(#(N,#`@07)C:&EV92X:``#<I\3]*@```-;___\"``$````````!W*?$.
  448. M_0(!.`@``'$````P$E">WC#X"@``QP<```$```````````!0>C$U````````P
  449. M````"@`07^\`````I`%`````0"DC*````0`8,$^@08$"#AH,(##`)2```F01]
  450. M."!=PTLDD)``D"3?P2,>!_*3`P`$#X-:P`@P$2P*LG_\6.`!0""%$P(T4CPA=
  451. MP$,(*P(X3+@)0`$.`!$G`<``X,25/V<IU@#`1`"&DE4`6)T1"`?$`TBO:!H`I
  452. M9!!0"B`$`(2)Z`*$5%;1D,45@08`A&G)\((00%)"AA1)"!"!%D@*("%G#`L`(
  453. M\L_?)V!5#M]!4%+`%$#4`GV0)1`$@"F"7/ZS]X%72<^@/\3R[#F*LG_X1#QY!
  454. MD0",0#Q1`>A("^>/X6@_U0H4%F0=`"Y-_0$J?CPYH[-`7P`@`02$BNEG)+!@P
  455. M4P`,""`B4`A,$:1JTW^"1%P'<48#B:0#VIT7!QW(&07E$'T_49<R*1!L1(<`D
  456. M$FP,P`\(=9&00ET$".:$+@/@\^``W!@%!@$@2$>`=""P0``*9V`(A!.0/,B3Z
  457. M3#2)P!T8R8DQH3-*_(1#>R)X:!\!YW&#(HZN_,.'BD`E9P@('[@0(`].U`$'D
  458. M&6#0,H0^=AG55#_8G-7=&>PD2<8;<QB9AAARA"%''DQ5`1L2YQP`@`_2<<"#2
  459. M=![HP*%1,!10SG+L`$!!"G!0!H`"=!H@AP@F4H`%("3)<,`+$#$`AP,F$B#'K
  460. M`H0!"(`C0^0)`*-V90@``R)(!\%V!6!QGB-,?`,`.$YTD22:`ZPI'0-\```'Y
  461. M`;P`088(B1Y03B!!L$,`$M$$`XTQ$$"`!"`_`/"#`3\<L-8_<'#QA!1&@(%-1
  462. MJ@``\^HYL;+Y::VWYKIKH@;\&NRPQ4)S3+++-AOML]/B8"VVVG+K;1U.F(D/Y
  463. MFM+!T`(`",C@(1:R`&$&`7H```8#"9-!`!P!J`3'/]<)_"<-'FI!B\($S/3P)
  464. MQQ)3;/$_XBE1A!D**$&$&098*)`@*I^!@,LA7@P&'2X$P((`=/J*Y[`B(#$--
  465. M,-(8`T(!T!R1*`"_%@L"`=`8`0TP$D#B2QL$P\P+UPJ<88`W17!#!!C*T#DPR
  466. M`G>N2RPP&BMPM1`0R+!V#N5AD0-:6JC,\@\!K.6/-%0\`08"S4X+0.$4<TM/M
  467. MJTF^<(`?MA+@BZX,1"LX*X5+<008[KCPP;=J-DSYK9>300*YN.J*`;KJ"DNLU
  468. ML<<L#0$@4A2!KSB>@V$-MZSR:Z8Z:#X@@8H`*`)"&@!8810$XCT@1P#AA`)`D
  469. M$!``L$(0_[@#0@O=[YB<,"LPI@[RRC-OA?A.,6)"=0N<@84**^B)0_T8P%$/F
  470. M-%(5#4P@_`"``UR@E/J!(`M`0,+_`EBCHRQ!2'W2!2#,(`$XH`$7"LL<M*0%^
  471. M`']0`0N&0\6M)`BS:7$`#)Q@0"$0`@`S4`(,"D#`P`CP#W9LY1]Z2!42X`&Y5
  472. M.J`I``)PP:QBE+PS,,!2BB"5J7J$BQ@5@`M&5-$3V></,3@1"U'D#A:H*`;)\
  473. M/0@`D@!AJH``B,@Y(%-@-`K[J&0E+"AA@@/"PS\X$09+@!"-I%#C3'C$1B`\>
  474. M\8TL0X(<-S$M/(`P6`#0@A+/DQ.(*`*0"A#D/S0Q+2V`$(D+`H`,+L6"+R0I>
  475. M#)(0G!8$QP/!*4((IYB6#4"8I%;Z,$VRL@L/6!`A)1AA#6T1E`&"$8QU<4$'?
  476. M,*",$@IP!@P@H```$``%0;#+7@J+"R\(I@"^:,DG3"%;S@#!`10HG0?M`QEB?
  477. M5%7P%$).`*!)DR;@#A-`$#\+D&`*=*H?`D2P!/;]PP4F4`(8S!$)9*0`"06`R
  478. MPC\+P(14,8$I=1"(Y(1(L!@1@`4A^J(/1'``4K&H1Q4"@.B25$Z%H&DI&S%!#
  479. M`)`@!"0,@1C!,`8P@!$,:@R!I$(0`C0$P2T&?`N(1D&*0)9"16<04`"'V"D`H
  480. ME'"(A5D(!`Z%*`8`]%`2*0%D%G(4!9KU('^8HW#:'&,9ZQ`&6G#4(`/05#(7V
  481. M8A`&&,0`Y!R`/"`R`'48Y!\*^0``&A"1@S"DG+@PB*8"X)F(4*$AB&B(:2("3
  482. M#X1L))E80`@C$`(,A-"#(N(9"!<H`@F*$`,*>HA!#0Q"!DT"H!$`(((`X)I,6
  483. MLPK$"1TUR%]36\Z[DC,-;J!#'=)`AS2\P0U>`I.8R'2&,%DP#6/H$AN^%*8Q%
  484. M'>0?R/5'8P%@@.4V5R#/9:YSIPM=ZDJWNM!%;F.TJUSL2C<`P&CN`,(+C`.03
  485. M%[S-12\PU'L`>$3WO=SEKG6;>P!P--<!<'AN?M=+W@,`XK[2?8![YQO?Y,ZW$
  486. MO/8%!G[UF]X$V^J^^ZWO>YU;X,8<>``)EK""$\R!!'\`'\]UL(.OR]P*=Y?$P
  487. MS14P@%/LX/TJ!<+T'3%\DRM?[]*7O`Z0+@>D^P'R=KBY/P;&`\AK8Q,?^`,)T
  488. MQH"(TTO>`?P7&$X6[Y.+3&,#VQC!,%9PA!.\8"W'>,+9K;*%KSQD(',XP0]8C
  489. M,G_I.V44&_G*</!#<^%QCEW2N;EPJ#,P\HSG.@>#'W(FL)A//&$<<*"Y>.!!0
  490. M<_'!A^8:VM&'!L:C@>&//X"YQ(,^<)SG[&=X'`#/D88#'O!LWS__X](&>#.*%
  491. M]QSH.P?#TWCV`)X_O6<_`QK5JIXP''PP9SF_VAW-C8,S@OT/0^S9`;OD![(%-
  492. MO5TKK_IB<RXU//PQ:SP/H,_)#C25&P.`R%)$K!$@JT"@8)"#"@0)!B&"02`BN
  493. MD*0```<&H8%!EB(0%AC$VX<MB4%V+!`,&(0"!J%#6N41$-RGQ/T"`4L)``")!
  494. M"```DA$%9:`GM0,``,(````!````````````4'HQ-2YI;F8``````!0`$'8+7
  495. M"@!0>C$U+FEN9F\```"D`4````!`*2,H``#'00`0`(#!@P>A`%@!H`"``00!P
  496. M@!B%L*+%BP\15`3A!<7!#AA#(E2H`H```"1LP8(HLJ7+ES!CRIQ)LZ;-FSAI$
  497. M?OC'\Q\^A#M[_CSH84P>3MOP("R:P=`WI40'].`T#*K!H#R'&O0P+XROI$N'K
  498. MY3'DS"H`#S/:&`)[$*O/I=O:V&*[=8_<;&8];"A@:)A6`&[_>OC6!A:PO,O>9
  499. MV#J\=,.!08S;]GPK66C.RY@S:][,N;/GSZ!#BQZ-4Z/!`7#T``@(W*?$_0(!S
  500. M*@H``)()``"2$0-EJ#+X````F`````$```````````!T:6QE,`!N9@``````W
  501. M"@`09ZH`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!?
  502. M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
  503. M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
  504. MOXO`#!I`JY8M3[=K(:9]*[=M7;H&Y\;-:Y<O7@!Z+Y;]=Q9B0-RGQ/T"`1(+7
  505. M``!Q"@``DA$&9>.)^````*$````!````````````=&EL93$`;F8```````H`,
  506. M$-1,`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40`H
  507. M`@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G5
  508. M1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+[
  509. MP`P:0*L6;0!@:R$"&P`7[8&Z<M_&-0A,KUN\?`_`VPL@+4^VAR&6_7<68D#<+
  510. MI\3]`@'Z"P``60L``)(1\612K?@```"A`````0```````````'1I;&4Q,`!F:
  511. M```````*`!!A[@````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H$
  512. M`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`S
  513. M/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R>
  514. M0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8'3M`@`&IZY;OW+[Z@W&#RY;GH?U$
  515. MEOUW%F)`W*?$_0(!XPP``$$,``"2$?)DV/7X````H@````$```````````!T:
  516. M:6QE,3$`9@``````"@`0!9(`````I`%`````0"DC*```C3R1T@2`07A)F`AI'
  517. MLA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y/
  518. M(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:UN
  519. M^M2@D"=$LD!$\Z^LOXO`#!I`JQ8M#@YK(0+#PR.N06#X^-@%`.SMWKYPW0:68
  520. MZ^_/W[9R$1LL^^\LQ(#<I\3]`@'0#0``*@T``)(1]&2I[/@```"F`````0``L
  521. M`````````'1I;&4Q,@!F```````*`!"_]`````"D`4````!`*2,H``"-/)'2)
  522. M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
  523. M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
  524. M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8/`.V`4`D
  525. M#`Z'O7WQ`(8#;F\P?O\`MY6[V ?V<A!@3<I\3]`@&[#@``%PX``)(1]62ZS
  526. M2?@```"D`````0```````````'1I;&4Q,P!F```````*`!!MXP````"D`4``M
  527. M``!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&G
  528. M-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&`
  529. M^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLAW
  530. M`H-W+J[!8/`.V`4`#(Z'O7WUNJU[,1@_N&QY)MY;]M]9B`$!W*?$_0(!IP\`_
  531. M``(/``"2$?9DE0WX````I0````$```````````!T:6QE,30`9@``````"@`0A
  532. M\^H`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"7
  533. M!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"=':
  534. M("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`T
  535. M#!I`JQ8M'!]K(0*#YR>NP6#PW-D%`"R.L[U]_QERZV!O,'Z%V?)4O+?LO[,0%
  536. M`P+<I\3]`@&4$```[@\``)(1]V3H>O@```"F`````0```````````'1I;&4Q+
  537. M-0!F```````*`!`VRP````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1F
  538. M@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@02
  539. MB`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0-
  540. M)T2R0$3SKZR_B\`,&D"K%BV<?VLA`H,'+J[!8/#\V04`#,Z!O7T'`(9S;F\PI
  541. M?GX`MY6[V ?V<A!@3<I\3]`@%_$0``VQ```)(1!V6W)?@```"D`````0``O
  542. M`````````'1I;&4R``!F```````*`!#,]P````"D`4````!`*2,H``"-/)'2H
  543. M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
  544. M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
  545. M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT!<&LA`G,`)Z[!M'71!@!F7
  546. M%P"P`X#ZSN6)]@$\P6WE)C98]M]9B`$!W*?$_0(!9Q(``,81``"2$0AE[,CX%
  547. M````H0````$```````````!T:6QE,P``9@``````"@`0"H(`````I`%`````T
  548. M0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)D
  549. M`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$_
  550. M*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`7!K(0)S&
  551. M`">NP;1UT0:`RS:O7+IV`0![&S@M3[:'(9;]=Q9B0-RGQ/T"`5`3``"N$@``G
  552. MDA$(9;^+^````*(````!````````````=&EL930``&8```````H`$+9]````*
  553. M`*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!`>
  554. M`"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`0
  555. M%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6!
  556. M[0!P:R$".P`7K8.Z<CG@-0CL`[ZX?`'L!9!V<%J>;!%#+/OO+,2`W*?$_0(!]
  557. M.!0``)<3``"2$0IEJFCX````H0````$```````````!T:6QE-0``9@``````]
  558. M"@`0X9,`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!"
  559. M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
  560. M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
  561. MOXO`#!I`JQ;M`WAK(0)SP-,MN+@&T\+!"R`M#+YS]Z(]<)=M7;EM(9;]=Q9BK
  562. M0-RGQ/T"`2`5``!_%```DA$*957&^````*$````!````````````=&EL938`Z
  563. M`&8```````H`$%TB`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#R
  564. M`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(7
  565. M!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`GL
  566. M1+)`1/.OK+^+P`P:0*L6[0%@:R$"<\`3+8>Z<C_`M0LNKD%@'/JB?;!7;EO#_
  567. M>`V6_7<68D#<I\3]`@$)%@``9Q4``)(1"V5+E?@```"B`````0``````````W
  568. M`'1I;&4W``!F```````*`!!C,@````"D`4````!`*2,H``"-/)'2!(!!>$F8=
  569. M"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."`'
  570. M`#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E\
  571. M-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT'<&LA`L,`EVU=N0&`Q34(;`"@O0#Z>
  572. M_D7K%W!:GFP10RS[[RS$@-RGQ/T"`>\6``!0%@``DA$,99,8^````)\````!\
  573. M````````````=&EL93@``&8```````H`$'GN`````*0!0````$`I(R@``(T\O
  574. MD=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!,
  575. M``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&8
  576. M-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6[0%P:R$"<P`GKL&Y==W"K
  577. M14O7+@"\?H&]#=Q6;F ?^=A1@0W*?$_0(!V!<``#87``"2$0QEJ5+X````6
  578. MH@````$```````````!T:6QE.0``9@``````"@`0F/``````I`%`````0"DC#
  579. M*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B!
  580. M`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H\
  581. M4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`V!K(0+C`"ZN>
  582. MP;EUW>:5"V#OW0!PT1X`9!=`6IYL$4,L^^\LQ(#<I\3]`@``````````````<
  583. H``````````````````````````````````````````````````#\@P``_
  584. ``
  585. end
  586. size 6160
  587. SHAR_EOF
  588. #    End of shell archive
  589. exit 0
  590. -- 
  591. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  592. Have five nice days.
  593.